/*
 * Cola_.c
 * 
 * Copyright 2014 gabo <gabo@tux>
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License
 * 
 * Algoritmo
 * ---------------------------------------------------------------------
 * 1 - Definir una estructura, un puntero que apunta al siguiente 
 * elemento y un puntero que contiene el nombre del elemento.
 * 2 - Se crean dos punteros del tipo de la estructura, uno sera el
 * primer elemento y el otro el último, ambos inicializados a 0 o NULL.
 * FUNCION PUSH
 * ############
 * 1 - Crear la funcion que agregara un nuevo elemento a la cola:
 * recibira como parámetro el elemento del tipo puntero de la estructura.
 * 2 - Ese elemento que apunta a siguiente se lo inicializa a NULL.
 * 3 - Si la cola está vacia (NULL), es decir, si el puntero al primer
 * elemento no tiene nada, entonces el elemento que agregamos será el
 * primer y al mismo tiempo será el último.
 * 4 - De lo contrario, si ya hay elementos en la cola, el puntero
 * último que apunta a siguiente será igual al elemento y el puntero
 * último será igual al elemento.
 * FUNCION POP
 * ###########
 * 1 - Se comprueba si el puntero al primero es NULL, si lo es, no se
 * puede sacar nada, se retorna NULL.
 * 2 - De lo contrario, se crea una variable puntero del tipo de la 
 * estructura que sera igual al puntero primero.
 * 3 - El puntero al primero sera igual al puntero primero apuntando
 * al siguiente elemento.
 * 4 - Se retorna el puntero creado.
 */

#include <stdio.h>
#include <stdlib.h>

typedef struct{
	struct  elemento * siguiente;
	char * nombre;
	
} elemento;

void agregar(elemento * _elemento);
void extraer();
	
elemento * primer = NULL;
elemento * ultimo = NULL;


int main( void )
{
	
	elemento * uno = malloc(sizeof(elemento));
	elemento * dos = malloc(sizeof(elemento));
	elemento * tres = malloc(sizeof(elemento));
	
	uno -> nombre = "Dato_1";
	dos -> nombre = "Dato_2";
	tres -> nombre = "Dato_3";
	
	puts( "Funcion agregar" );
	agregar(uno);
	agregar(dos);
	agregar(tres);
	
	printf( "%s, ", uno -> nombre );
	printf( "%s, ", dos -> nombre );
	printf( "%s", tres -> nombre );
	printf( "\n\n" );
	
	elemento * i = extraer();
	
	puts( "Funcion extraer" );
	
	while( i != NULL )
	{
		printf( "%s, ", i -> nombre );
		
		i = extraer();
		}
		
	return 0;
	}


void agregar(elemento * _elemento)
{
	_elemento -> siguiente = NULL;
	
	if( primer == NULL )
	{
		primer = _elemento;
		ultimo = _elemento;
		}
	
	else
	{
		ultimo -> siguiente = _elemento;
		ultimo = _elemento;
		}
}

/* Fucion POP para una cola */
elemento * extraer( void )
{
	if( primer == NULL )
	{
		return NULL;
		}
	elemento * elemento_retorno = primer;
	primer = primer -> siguiente;
	return elemento_retorno;
	
}
